package org.hcf.utils.word;

import lombok.Getter;
import org.apache.poi.xwpf.usermodel.*;

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DocxTemplateHandler {
//
//    private final Map<String, Object> params;
//
//    /** 模板读入流 */
//    InputStream is;
//    /** 文件写出流 */
//    OutputStream os;
//    /** 此类为poi操作word模板的工具类*/
//    @Getter
//    XWPFDocument doc;
//    /** 占位符替换正则工具 */
//    Pattern pattern;
//
//    public static final String MKEY="mkey";
//    public static final String KEY_REGEX =".*\\$\\{(?<"+MKEY+">[a-zA-Z0-9_]+)}.*";
//
//    /** 初始化 */
//    public DocxTemplateHandler(InputStream is, OutputStream os,Map<String, Object> params) {
//        this.params = params;
//        try {
//            this.is = is;
//            this.os = os;
//            this.doc = new XWPFDocument(is);
//            this.pattern= Pattern.compile(KEY_REGEX);
//        } catch (IOException e) {
//            throw new RuntimeException("无法初始化word文档替换工具！");
//        }
//    }
//
//    public void commonHandle() throws IOException {
//        this.replaceInPara();
//        this.replaceInTable();
//        // 写出
//        this.doc.write(this.os);
//        // 关闭
//        this.closeInputStream();
//        this.closeOutputStream();
//    }
//
//    /**
//     * 替换段落里面的变量
//     */
//    public void replaceInPara() {
//        Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
//        XWPFParagraph para;
//        while (iterator.hasNext()) {
//            para = iterator.next();
//            this.replaceInPara(para);
//        }
//    }
//
//    /**
//     * 替换段落里面的变量
//     */
//    public void replaceInPara(XWPFParagraph para) {
//        List<XWPFRun> runs;
//        runs = para.getRuns();
//
//        Map<Integer, String> helper = new HashMap<>();
//        for (int i = 0; i < runs.size(); i++) {
//            XWPFRun run = runs.get(i);
//            String runText = run.toString();
////            System.out.println("------>>>>>>>>>" + runText);
//            if(runText.matches(KEY_REGEX)){
//                helper.put(i, runText);
//            }
//        }
//
//        for (Map.Entry<Integer, String> entry : helper.entrySet()) {
//            Integer pos = entry.getKey();
//            String str = replaceStr(entry.getValue());
//            if( Objects.nonNull(str) ){
//                replaceTextRun(para, pos, str);
//            }
//        }
//    }
//
//    private String replaceStr(String str){
//        Matcher matcher = pattern.matcher(str);
//        matcher.matches();
//        String mkey = matcher.group(MKEY);
//        Object mval = params.get(mkey);
//        if(Objects.nonNull(mval)){
//            // 文本内容修改
//            String placeholder = String.format("${%s}", mkey);
//            return str.replace(placeholder, String.valueOf(mval));
//        }
//        return null;
//    }
//
//    /**
//     * 替换
//     * @param para
//     * @param pos
//     * @param o
//     */
//    public void replaceTextRun(XWPFParagraph para, int pos, Object o){
//        XWPFRun oldRun = para.getRuns().get(pos);
//        XWPFRun newRun = para.insertNewRun(pos);
//        copyRunSettings(oldRun, newRun);
//        para.removeRun(pos+1);
//        newRun.setText(o.toString());
//    }
//
//    /**
//     * 复制源中的一些设置到目标Run中
//     * @param source 源
//     * @param target 目标
//     */
//    public void copyRunSettings(XWPFRun source, XWPFRun target){
//        target.setColor(source.getColor());
//        target.setCharacterSpacing(source.getCharacterSpacing());
//        target.setFontFamily(source.getFontFamily());
//        target.setFontSize(source.getFontSize());
//        target.setKerning(source.getKerning());
//        target.setStyle(source.getStyle());
//        target.setUnderline(source.getUnderline());
//        target.setUnderlineColor(source.getUnderlineColor());
//        if(Objects.nonNull(source.getUnderlineThemeColor())){
//            target.setUnderlineThemeColor(source.getUnderlineThemeColor().toString());
//        }
//        if(Objects.nonNull(source.getEmphasisMark())){
//            target.setEmphasisMark(source.getEmphasisMark().toString());
//        }
//    }
//
//    /**
//     * 替换表格里面的变量
//     */
//    public void replaceInTable() {
//        Iterator<XWPFTable> iterator = doc.getTablesIterator();
//        XWPFTable table;
//        List<XWPFTableRow> rows;
//        List<XWPFTableCell> cells;
//        List<XWPFParagraph> paras;
//        while (iterator.hasNext()) {
//            table = iterator.next();
//            rows = table.getRows();
//            for (XWPFTableRow row : rows) {
//                cells = row.getTableCells();
//                for (XWPFTableCell cell : cells) {
//                    paras = cell.getParagraphs();
//                    for (XWPFParagraph para : paras) {
//                        this.replaceInPara(para);
//                    }
//                }
//            }
//        }
//    }
//
//    /**
//     * 关闭输入流
//     */
//    public void closeInputStream() {
//        if (is != null) {
//            try {
//                is.close();
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     * 关闭输出流
//     *
//     * @param os
//     */
//    public void closeOutputStream() {
//        if (os != null) {
//            try {
//                this.os.close();
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }

}